/*
 PDFObject v1.2.20111123
 https://github.com/pipwerks/PDFObject
 Copyright (c) Philip Hutchison
 MIT-style license: http://pipwerks.mit-license.org/
 */

/*jslint browser: true, sloppy: true, white: true, plusplus: true */
/*global ActiveXObject, window */

var PDFObject = function(obj) {

    if (!obj || !obj.url) {
        return false;
    }

    var pdfobjectversion = "1.2",
            //Set reasonable defaults
            id = obj.id || false,
            width = obj.width || "100%",
            height = obj.height || "100%",
            pdfOpenParams = obj.pdfOpenParams,
            url,
            pluginTypeFound,
            //declare functions
            createAXO,
            hasReaderActiveX,
            hasReader,
            hasGeneric,
            pluginFound,
            setCssForFullWindowPdf,
            buildQueryString,
            get,
            embed;


    /* ----------------------------------------------------
     Supporting functions
     ---------------------------------------------------- */

    createAXO = function(type) {
        var ax;
        try {
            ax = new ActiveXObject(type);
        } catch (e) {
            //ensure ax remains null
            ax = null;
        }
        return ax;
    };

    //Tests specifically for Adobe Reader (aka Acrobat) in Internet Explorer
    hasReaderActiveX = function() {

        var axObj = null;

        if (window.ActiveXObject) {

            axObj = createAXO("AcroPDF.PDF");

            //If "AcroPDF.PDF" didn't work, try "PDF.PdfCtrl"
            if (!axObj) {
                axObj = createAXO("PDF.PdfCtrl");
            }

            //If either "AcroPDF.PDF" or "PDF.PdfCtrl" are found, return true
            if (axObj !== null) {
                return true;
            }

        }

        //If you got to this point, there's no ActiveXObject for PDFs
        return false;

    };



    //Tests specifically for Adobe Reader (aka Adobe Acrobat) in non-IE browsers
    hasReader = function() {

        var i,
                n = navigator.plugins,
                count = n.length,
                regx = /Adobe Reader|Adobe PDF|Acrobat/gi;

        for (i = 0; i < count; i++) {
            if (regx.test(n[i].name)) {
                return true;
            }
        }

        return false;

    };


    //Detects unbranded PDF support
    hasGeneric = function() {
        var plugin = navigator.mimeTypes["application/pdf"];
        return (plugin && plugin.enabledPlugin);
    };


    //Determines what kind of PDF support is available: Adobe or generic
    pluginFound = function() {

        var type = null;

        if (hasReader() || hasReaderActiveX()) {

            type = "Adobe";

        } else if (hasGeneric()) {

            type = "generic";

        }

        return type;

    };


    //If setting PDF to fill page, need to handle some CSS first
    setCssForFullWindowPdf = function() {

        var html = document.getElementsByTagName("html"),
                html_style,
                body_style;

        if (!html) {
            return false;
        }

        html_style = html[0].style;
        body_style = document.body.style;

        html_style.height = "100%";
        html_style.overflow = "hidden";
        body_style.margin = "0";
        body_style.padding = "0";
        body_style.height = "100%";
        body_style.overflow = "hidden";

    };


    //Creating a querystring for using PDF Open parameters when embedding PDF
    buildQueryString = function(pdfParams) {

        var string = "",
                prop;

        if (!pdfParams) {
            return string;
        }

        for (prop in pdfParams) {

            if (pdfParams.hasOwnProperty(prop)) {

                string += prop + "=";

                if (prop === "search") {

                    string += encodeURI(pdfParams[prop]);

                } else {

                    string += pdfParams[prop];

                }

                string += "&";

            }

        }

        //Remove last ampersand
        return string.slice(0, string.length - 1);

    };


    //Simple function for returning values from PDFObject
    get = function(prop) {

        var value = null;

        switch (prop) {
            case "url" :
                value = url;
                break;
            case "id" :
                value = id;
                break;
            case "width" :
                value = width;
                break;
            case "height" :
                value = height;
                break;
            case "pdfOpenParams" :
                value = pdfOpenParams;
                break;
            case "pluginTypeFound" :
                value = pluginTypeFound;
                break;
            case "pdfobjectversion" :
                value = pdfobjectversion;
                break;
        }

        return value;

    };


    /* ----------------------------------------------------
     PDF Embedding functions
     ---------------------------------------------------- */


    embed = function(targetID) {

        if (!pluginTypeFound) {
            return false;
        }

        var targetNode = null;

        if (targetID) {

            //Allow users to pass an element OR an element's ID
            targetNode = (targetID.nodeType && targetID.nodeType === 1) ? targetID : document.getElementById(targetID);

            //Ensure target element is found in document before continuing
            if (!targetNode) {
                return false;
            }

        } else {

            targetNode = document.body;
            setCssForFullWindowPdf();
            width = "100%";
            height = "100%";

        }

        targetNode.innerHTML = '<object    data="' + url + '" type="application/pdf" width="' + width + '" height="' + height + '"></object>';

        return targetNode.getElementsByTagName("object")[0];

    };

    //The hash (#) prevents odd behavior in Windows
    //Append optional Adobe params for opening document
    url = encodeURI(obj.url) + "#" + buildQueryString(pdfOpenParams);
    pluginTypeFound = pluginFound();

    this.get = function(prop) {
        return get(prop);
    };
    this.embed = function(id) {
        return embed(id);
    };
    this.pdfobjectversion = pdfobjectversion;

    return this;

};